// 用户路由的处理函数
const db = require('../db/index')
// 导入密码加密模块
const bcrypt = require('bcryptjs')
// 导入生成token的包
const jwt = require('jsonwebtoken')
// 导入密钥
const { jwtSecretKey,expiresIn } = require('../config')

// 注册
exports.reguser = (req, res) => {
  // 获取用户信息
  const userinfo = req.body
  // 校验表单数据是否为空
  // if (!userinfo.username || !userinfo.password) {
  //   return res.cc('用户名和密码不能为空')
  // }
  // 操作数据库
  db.getConnection((err, connection) => {
    // 如果连接mysql数据库失败，返回失败信息
    if (err) {
      return res.cc(err)
    } else {
      const sql = 'SELECT * from ev_users where username=?'
      connection.query(sql, userinfo.username, (err, data) => {
        // 如果查询失败返回查询信息
        if (err) {
          return res.cc(err)
        }
        // 判断用户名是否被占用
        if (data.length > 0) {
          return res.cc("用户名已被使用")
        }
        // 用户名可用，对密码进行加密处理
        userinfo.password = bcrypt.hashSync(userinfo.password, 10) // 密码 | 随机盐长度
        // 保存到数据库
        connection.query('INSERT INTO ev_users SET ?', {
          username: userinfo.username,
          password: userinfo.password
        }, (err, data) => {
          if (err) {
            return res.cc(err)
          }
          // 如果影响行数不为1
          if (data.affectedRows !== 1) {
            return res.cc("注册失败，请稍后再试")
          }
          // 用户注册成功
          res.cc('注册成功', 0)
        })
      })
      // 释放连接
      connection.release()
      // 用连接池对象的end方法关闭连接池
      // db.end()
    }
  })
}

// 登录
exports.login = (req, res) => {
  db.getConnection((err, connection) => {
    if (err) {
      res.cc('数据库连接失败')
    } else {
      // 检测用户名是否正确
      const sql = 'SELECT * FROM ev_users WHERE username = ?'
      connection.query(sql, req.body.username, (err, data) => {
        if (err) return res.cc('登录失败，请稍后重试')
        if (data.length !== 1) return res.cc('登录失败')
        // 判断密码是否正确
        const isOk = bcrypt.compareSync(req.body.password, data[0].password) // 判断数据库的密码和传过来的密码是否相等
        if (!isOk) return res.cc('用户名或密码错误')
        // 密码验证通过，处理用户信息
        const user = { // 解构出用户信息，并把其中的敏感信息置空
          ...data[0],
          password: '',
          user_pic: ''
        }
        // 生成token字符串
        const tokenStr = jwt.sign(user, jwtSecretKey, {
          expiresIn
        })
        // 登录成功返回token
        res.send({
          status: 0,
          message: '登录成功',
          token: 'Bearer ' + tokenStr // 拼接好便于前端使用
        })
      })
      connection.release()
    }
  })
}